rails_blocks 0.8.1 → 0.9.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb776741563cf39110602da7ffc497ffd2c736318680605de378c6e0d3380fa9
4
- data.tar.gz: 0336f186612c4cb4f8eafaa9f03ed8018d9a7a6ddc57d7f4617bad359063fd98
3
+ metadata.gz: 033ebb0f7ed446801f2ae9cd57276c54881fa1ce0790b67475e8c0d3d58aaf68
4
+ data.tar.gz: 909f87b36efb9f8c909de64e51564b5ca57c575253052374c4791b891f0705c6
5
5
  SHA512:
6
- metadata.gz: 2ef7424334bd1c1cac0c0097f52f1ddf5dfe93309f38630a988423301bd01e214c2948384a3f0b892626f5149923cc25fd0535252bc245c021619517c7af1458
7
- data.tar.gz: 8696b7e04d9c3a8b065f373b9e0187c09ff7c48bd7c092db44eb5d7816f881ffb5b3754fdc4ec23442939d2af69aba9835a0c4fbcb46661bfb51cb1e7703ef43
6
+ metadata.gz: ed545d3e344a507e4c30cbd7b14bee0186e464e9a54c60d8f4498557607bec1bc1df142eefcfa9d37039f254cb08e5ab7cc0863123d6d4363a9a43480af58133
7
+ data.tar.gz: 6f95e004db9ef7883bf17f41bd36fd226b3c7659ae3b5e85ae975c3dd6f63fcafe093de2674312a12ad915f8fcbc2b50c2ae4197bbbcbbbc9c1d03828cec5be6
@@ -0,0 +1,140 @@
1
+ (function() {
2
+ var hasProp = {}.hasOwnProperty;
3
+
4
+ window.$$ = {
5
+ decls: {},
6
+ cache: {},
7
+ bem_class: 'js-bem',
8
+ bem_class_selector: ".js-bem",
9
+ bemDataKey: 'bem',
10
+ blockInitializationErrorHandler: function(e) {
11
+ return console.error("Can't initialize block " + name + ", check declaration. " + e.name + " : " + e.message);
12
+ },
13
+ processOptions: function($dom, item_name, b_name, o) {
14
+ var attr, attr_value, currentData, e_name, e_o, ref, ref1;
15
+ if (o.attrs) {
16
+ ref = o.attrs;
17
+ for (attr in ref) {
18
+ attr_value = ref[attr];
19
+ $dom.prop(attr, attr_value);
20
+ }
21
+ }
22
+ if (o.content) {
23
+ $dom.html(o.content);
24
+ }
25
+ if (o.mix) {
26
+ $dom.addClass($$.mixClass(o.mix));
27
+ }
28
+ if (o.data) {
29
+ currentData = $dom.data($$.bemDataKey) || {};
30
+ currentData[item_name] = o.data;
31
+ $dom.data($$.bemDataKey, currentData);
32
+ }
33
+ if (o.elements) {
34
+ ref1 = o.elements;
35
+ for (e_name in ref1) {
36
+ e_o = ref1[e_name];
37
+ $$.makeElement($dom, b_name, e_name, e_o);
38
+ }
39
+ }
40
+ return $dom;
41
+ },
42
+ makeDom: function(o, klass) {
43
+ var tag;
44
+ o || (o = {});
45
+ tag = o.tag || 'div';
46
+ return $("<" + tag + ">)").addClass(klass);
47
+ },
48
+ makeElement: function($parent, b_name, e_name, o) {
49
+ var $e, item_name;
50
+ item_name = $$.elementClass(b_name, e_name);
51
+ $e = this.makeDom(o, item_name);
52
+ $$.processOptions($e, item_name, b_name, o);
53
+ if (o.prepend) {
54
+ $parent.prepend($e);
55
+ } else {
56
+ $parent.append($e);
57
+ }
58
+ return $e;
59
+ },
60
+ makeBlock: function(b_name, o) {
61
+ var $b, item_name;
62
+ item_name = $$.blockClass(b_name);
63
+ $b = this.makeDom(o, item_name);
64
+ $$.processOptions($b, item_name, b_name, o);
65
+ return $b;
66
+ },
67
+ init: function($context) {
68
+ var $blocks;
69
+ $blocks = $context.find($$.bem_class_selector);
70
+ if ($context.hasClass($$.bem_class)) {
71
+ $blocks = $blocks.add($context);
72
+ }
73
+ return $$.initBlocks($blocks);
74
+ },
75
+ initBlocks: function($context, options) {
76
+ return $context.each(function() {
77
+ var $node, allParams, name, params, results;
78
+ $node = $(this);
79
+ allParams = $node.data($$.bemDataKey);
80
+ results = [];
81
+ for (name in allParams) {
82
+ if (!hasProp.call(allParams, name)) continue;
83
+ params = allParams[name];
84
+ if (name.indexOf('__') !== -1) {
85
+ continue;
86
+ }
87
+ results.push($$.getBlock($node, name, params));
88
+ }
89
+ return results;
90
+ });
91
+ },
92
+ getBlock: function($b, name, params) {
93
+ var bid, block, cacheKey, e;
94
+ cacheKey = name + "_bid";
95
+ bid = $b.data(cacheKey);
96
+ if (bid) {
97
+ return $$.cache[bid];
98
+ }
99
+ try {
100
+ block = new $$.decls[$$.utils.camelCase(name)]($b, params, name);
101
+ bid = block.id;
102
+ $b.data(cacheKey, bid);
103
+ $$.cache[bid] = block;
104
+ return block;
105
+ } catch (error) {
106
+ e = error;
107
+ if ($$.blockInitializationErrorHandler) {
108
+ return $$.blockInitializationErrorHandler(e, name, params);
109
+ }
110
+ }
111
+ },
112
+ makeMod: function(name, value) {
113
+ var mod;
114
+ mod = name;
115
+ if (value) {
116
+ mod += "_" + value;
117
+ }
118
+ return mod;
119
+ },
120
+ mixClass: function(mix) {
121
+ if (mix.e) {
122
+ return mix.b + "__" + mix.e;
123
+ }
124
+ return mix.b;
125
+ },
126
+ blockModClass: function(name, mod, value) {
127
+ return name + "--" + ($$.makeMod(mod, value));
128
+ },
129
+ elementModClass: function(b_name, e_name, mod, value) {
130
+ return ($$.elementClass(b_name, e_name)) + "--" + ($$.makeMod(mod, value));
131
+ },
132
+ blockClass: function(b_name) {
133
+ return b_name;
134
+ },
135
+ elementClass: function(b_name, e_name) {
136
+ return b_name + "__" + e_name;
137
+ }
138
+ };
139
+
140
+ }).call(this);
@@ -0,0 +1,94 @@
1
+ class Block {
2
+ constructor($b, params, name) {
3
+ this.$node = $b;
4
+ this.name = name;
5
+ this.id = $$.utils.guid();
6
+ this.params = params;
7
+ if (this.events) {
8
+ this._addEvents();
9
+ }
10
+ if (this.init) {
11
+ this.init();
12
+ }
13
+ }
14
+
15
+ elem(e_name, mod_name, mod_value, context) {
16
+ var $elem;
17
+ if (context == null) {
18
+ context = this.$node;
19
+ }
20
+ $elem = $(this.elemSelector(e_name, mod_name, mod_value), context);
21
+ $elem.e_name = e_name;
22
+ $elem.b_name = this.name;
23
+ return $elem;
24
+ };
25
+
26
+ elemSelector(e_name, mod_name, mod_value) {
27
+ if (mod_name) {
28
+ return "." + ($$.elementModClass(this.name, e_name, mod_name, mod_value));
29
+ }
30
+ return "." + (this._elementClass(e_name));
31
+ };
32
+
33
+ on() {
34
+ return this.$node.on.apply(this.$node, arguments);
35
+ };
36
+
37
+ _addEvents(element) {
38
+ var event_name, handler, p, ref, results;
39
+ ref = this.events;
40
+ results = [];
41
+ for (event_name in ref) {
42
+ handler = ref[event_name];
43
+ p = event_name.split(' ');
44
+ if (typeof handler === 'string') {
45
+ handler = decl.methods[handler];
46
+ }
47
+ results.push(this.$node.on(p[0], p[1], handler.bind(this)));
48
+ }
49
+ return results;
50
+ };
51
+
52
+ _trigger(event, data) {
53
+ return this.$node.trigger(event, data);
54
+ };
55
+
56
+ _elementClass(e_name) {
57
+ return $$.elementClass(this.name, e_name);
58
+ };
59
+
60
+ addElem(e_name, o, $parent) {
61
+ var $elem;
62
+ o || (o = {});
63
+ $elem = $$.makeElement($parent || this.$node, this.name, e_name, o);
64
+ $elem.e_name = e_name;
65
+ $elem.b_name = this.name;
66
+ return $elem;
67
+ };
68
+
69
+ asElem($elem, name) {
70
+ $elem.e_name = name;
71
+ $elem.b_name = this.name;
72
+ return $elem;
73
+ };
74
+
75
+ addMod(mod, value) {
76
+ return this.$node.addClass($$.blockModClass(this.name, mod, value));
77
+ };
78
+
79
+ delMod(mod, value) {
80
+ return this.$node.removeClass($$.blockModClass(this.name, mod, value));
81
+ };
82
+
83
+ toggleMod(mod, value) {
84
+ if (this.hasMod(mod, value)) {
85
+ return this.delMod(mod, value);
86
+ } else {
87
+ return this.addMod(mod, value);
88
+ }
89
+ };
90
+
91
+ hasMod(mod, value) {
92
+ return this.$node.hasClass($$.blockModClass(this.name, mod, value));
93
+ };
94
+ }
@@ -0,0 +1,72 @@
1
+ (function() {
2
+ $(function() {
3
+ var originalEq;
4
+ $.b = function(name) {
5
+ arguments[0] = '.' + name;
6
+ return $.apply(null, arguments);
7
+ };
8
+ originalEq = $.fn.eq;
9
+ return $.fn.extend({
10
+ destroyBlocks: function() {
11
+ return this.find($$.bem_class_selector).getBlocks().each(function() {
12
+ return this.destroy();
13
+ });
14
+ },
15
+ isElem: function() {
16
+ if (this.e_name) {
17
+ return true;
18
+ }
19
+ return false;
20
+ },
21
+ addMod: function(name, value) {
22
+ if (this.isElem()) {
23
+ return this.addClass($$.elementModClass(this.b_name, this.e_name, name, value));
24
+ } else {
25
+ return this.addClass($$.blockModClass(this.b_name, name, value));
26
+ }
27
+ },
28
+ hasMod: function(name, value) {
29
+ if (this.isElem()) {
30
+ return this.hasClass($$.elementModClass(this.b_name, this.e_name, name, value));
31
+ } else {
32
+ return this.hasClass($$.blockModClass(this.b_name, name, value));
33
+ }
34
+ },
35
+ toggleMod: function(mod, value) {
36
+ if (this.hasMod(mod, value)) {
37
+ return this.delMod(mod, value);
38
+ } else {
39
+ return this.addMod(mod, value);
40
+ }
41
+ },
42
+ delMod: function(name, value) {
43
+ if (this.isElem()) {
44
+ return this.removeClass($$.elementModClass(this.b_name, this.e_name, name, value));
45
+ } else {
46
+ return this.removeClass($$.blockModClass(this.b_name, name, value));
47
+ }
48
+ },
49
+ asBlock: function(name, o) {
50
+ this.addClass("" + name);
51
+ return $$.getBlock(this, name, o);
52
+ },
53
+ bemParams: function() {
54
+ var allParams;
55
+ allParams = this.data($$.bemDataKey);
56
+ if (this.isElem()) {
57
+ return allParams[$$.elementClass(this.b_name, this.e_name)];
58
+ } else {
59
+ return console.log('Error, only for elements. Use initBlock for blocks.');
60
+ }
61
+ },
62
+ eq: function() {
63
+ var collection;
64
+ collection = originalEq.apply(this, arguments);
65
+ collection.b_name = this.b_name;
66
+ collection.e_name = this.e_name;
67
+ return collection;
68
+ }
69
+ });
70
+ });
71
+
72
+ }).call(this);
@@ -0,0 +1,17 @@
1
+ (function() {
2
+ window.$$.utils = {
3
+ _id: 0,
4
+ camelCase: function(input) {
5
+ return input.toLowerCase().replace(/(^|-)(.)/g, function(match, $1, $2) {
6
+ return $2.toUpperCase();
7
+ });
8
+ },
9
+ dash: function(input) {
10
+ return input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
11
+ },
12
+ guid: function() {
13
+ return this._id++;
14
+ }
15
+ };
16
+
17
+ }).call(this);
@@ -1,6 +1,18 @@
1
1
  require 'rails_blocks/names'
2
2
  require 'rails_blocks/path'
3
3
 
4
+ class RenderContext
5
+ attr_accessor :slots, :rendered_slots
6
+ def initialize
7
+ @slots = {}
8
+ @rendered_slots = {}
9
+ end
10
+
11
+ def slot(name, &block)
12
+ slots[name] = block
13
+ end
14
+ end
15
+
4
16
  module BlockHelper
5
17
  include RailsBlocks::Path
6
18
  include RailsBlocks::Names
@@ -65,13 +77,14 @@ module BlockHelper
65
77
  end
66
78
 
67
79
  def entity(template, type, name, options, &block)
68
- content = block ? capture(&block) : options[:content]
80
+ ctx = RenderContext.new
81
+ content = block ? capture(ctx, &block) : options[:content]
82
+ ctx.slots.each {|k, v| ctx.rendered_slots[k] = capture(&v)}
69
83
  #важно заполнять публичные поля только после того, как закапчюрится то, что внутри энтити, иначе они перезапишутся.
70
84
  @attrs = nil
71
85
  @current_options = options
72
86
  @current_entity = {type: type, name: name}
73
- p template
74
- template.nil? ? empty(content) : render(template: template, locals: {content: content, options: options})
87
+ template.nil? ? empty(content) : render(template: template, locals: {content: content, options: options, slots: ctx.rendered_slots})
75
88
  end
76
89
 
77
90
  def empty(content)
@@ -71,7 +71,6 @@ module RailsBlocks
71
71
  parts = file.split('/')
72
72
  filename = File.basename(file, RailsBlocks.config.template_engine)
73
73
  filename = File.basename(filename, '.html')
74
- p filename
75
74
  template = {
76
75
  level: parts[0],
77
76
  block: parts[1],
@@ -1,3 +1,3 @@
1
1
  module RailsBlocks
2
- VERSION = "0.8.1".freeze
2
+ VERSION = "0.9.0.beta.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Potetiurin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-12 00:00:00.000000000 Z
11
+ date: 2023-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -157,11 +157,11 @@ files:
157
157
  - LICENSE.txt
158
158
  - README.md
159
159
  - Rakefile
160
- - app/assets/javascripts/bem_blocks.coffee
161
- - app/assets/javascripts/block.coffee
162
- - app/assets/javascripts/jquery.bem_exts.coffee
160
+ - app/assets/javascripts/bem_blocks.js
161
+ - app/assets/javascripts/block.js
162
+ - app/assets/javascripts/jquery.bem_exts.js
163
163
  - app/assets/javascripts/rails_blocks.js
164
- - app/assets/javascripts/utils.coffee
164
+ - app/assets/javascripts/utils.js
165
165
  - app/assets/stylesheets/rails_blocks.sass
166
166
  - app/helpers/block_helper.rb
167
167
  - app/views/rails_blocks/element.slim
@@ -227,9 +227,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
227
  version: '0'
228
228
  required_rubygems_version: !ruby/object:Gem::Requirement
229
229
  requirements:
230
- - - ">="
230
+ - - ">"
231
231
  - !ruby/object:Gem::Version
232
- version: '0'
232
+ version: 1.3.1
233
233
  requirements: []
234
234
  rubygems_version: 3.4.15
235
235
  signing_key:
@@ -1,95 +0,0 @@
1
- window.$$ =
2
- decls: {}
3
- cache: {}
4
- bem_class: 'js-bem'
5
- bem_class_selector: ".js-bem"
6
- bemDataKey: 'bem'
7
-
8
- blockInitializationErrorHandler: (e) ->
9
- console.error "Can't initialize block #{name}, check declaration. #{e.name} : #{e.message}"
10
-
11
- processOptions: ($dom, item_name, b_name, o) ->
12
- if o.attrs
13
- for attr, attr_value of o.attrs
14
- $dom.prop(attr, attr_value)
15
- if o.content
16
- $dom.html(o.content)
17
- if o.mix
18
- $dom.addClass($$.mixClass(o.mix))
19
- if o.data
20
- currentData = $dom.data($$.bemDataKey) || {}
21
- currentData[item_name] = o.data
22
- $dom.data($$.bemDataKey, currentData)
23
- if o.elements
24
- for e_name, e_o of o.elements
25
- $$.makeElement($dom, b_name, e_name, e_o)
26
- $dom
27
-
28
- makeDom: (o, klass) ->
29
- o ||= {}
30
- tag = o.tag || 'div'
31
- $("<#{tag}>)").addClass(klass)
32
-
33
- makeElement: ($parent, b_name, e_name, o) ->
34
- item_name = $$.elementClass(b_name, e_name)
35
- $e = @makeDom(o, item_name)
36
- $$.processOptions($e, item_name, b_name, o)
37
- if o.prepend
38
- $parent.prepend $e
39
- else
40
- $parent.append $e
41
- $e
42
-
43
- makeBlock: (b_name, o) ->
44
- item_name = $$.blockClass(b_name)
45
- $b = @makeDom(o, item_name)
46
- $$.processOptions($b, item_name, b_name, o)
47
- $b
48
-
49
- init: ($context) ->
50
- $blocks = $context.find($$.bem_class_selector)
51
- $blocks = $blocks.add($context) if $context.hasClass $$.bem_class
52
- $$.initBlocks($blocks)
53
-
54
- initBlocks: ($context, options) ->
55
- $context.each ->
56
- $node = $(this)
57
- allParams = $node.data($$.bemDataKey)
58
- for own name, params of allParams
59
- continue if name.indexOf('__') != -1
60
- $$.getBlock($node, name, params)
61
-
62
- getBlock: ($b, name, params)->
63
- cacheKey = "#{name}_bid"
64
- bid = $b.data(cacheKey)
65
- if bid
66
- return $$.cache[bid]
67
- try
68
- block = new $$.decls[$$.utils.camelCase(name)]($b, params, name)
69
- bid = block.id
70
- $b.data cacheKey, bid
71
- $$.cache[bid] = block
72
- block
73
- catch e
74
- $$.blockInitializationErrorHandler(e) if $$.blockInitializationErrorHandler
75
-
76
- makeMod: (name, value) ->
77
- mod = name
78
- mod += "_#{value}" if value
79
- mod
80
-
81
- mixClass: (mix) ->
82
- return "#{mix.b}__#{mix.e}" if mix.e
83
- mix.b
84
-
85
- blockModClass: (name, mod, value) ->
86
- "#{name}--#{$$.makeMod(mod, value)}"
87
-
88
- elementModClass: (b_name, e_name, mod, value) ->
89
- "#{$$.elementClass(b_name, e_name)}--#{$$.makeMod(mod, value)}"
90
-
91
- blockClass: (b_name) ->
92
- b_name
93
-
94
- elementClass: (b_name, e_name) ->
95
- "#{b_name}__#{e_name}"
@@ -1,65 +0,0 @@
1
- class window.Block
2
- constructor: ($b, params, name) ->
3
- @$node = $b
4
- @name = name
5
- @id = $$.utils.guid()
6
- @params = params
7
- #$.extend this, decl.methods
8
- @_addEvents() if @events
9
- # if @elements
10
- # for element in @elements
11
- # @_addEvents(element)
12
- @init() if @init
13
-
14
- elem: (e_name, mod_name, mod_value, context = @$node) ->
15
- $elem = $(@elemSelector.apply(@, arguments), context)
16
- $elem.e_name = e_name
17
- $elem.b_name = @name
18
- $elem
19
-
20
- elemSelector: (e_name, mod_name, mod_value) ->
21
- return ".#{$$.elementModClass(@name, e_name, mod_name, mod_value)}" if mod_name
22
- ".#{@_elementClass(e_name)}"
23
-
24
- on: () ->
25
- @$node.on.apply(@$node, arguments)
26
-
27
- _addEvents: (element)->
28
- for event_name, handler of @events
29
- p = event_name.split(' ')
30
- if typeof handler == 'string'
31
- handler = decl.methods[handler]
32
- @$node.on p[0], p[1], handler.bind(@)
33
-
34
- _trigger: (event, data) ->
35
- @$node.trigger event, data
36
-
37
- _elementClass: (e_name) ->
38
- $$.elementClass(@name, e_name)
39
-
40
- addElem: (e_name, o, $parent) ->
41
- o ||= {}
42
- $elem = $$.makeElement($parent || @$node, @name, e_name, o)
43
- $elem.e_name = e_name
44
- $elem.b_name = @name
45
- $elem
46
-
47
- asElem: ($elem, name) ->
48
- $elem.e_name = name
49
- $elem.b_name = @name
50
- $elem
51
-
52
- addMod: (mod, value) ->
53
- @$node.addClass($$.blockModClass(@name, mod, value))
54
-
55
- delMod: (mod, value) ->
56
- @$node.removeClass($$.blockModClass(@name, mod, value))
57
-
58
- toggleMod: (mod, value) ->
59
- if @hasMod(mod, value)
60
- @delMod(mod, value)
61
- else
62
- @addMod(mod, value)
63
-
64
- hasMod: (mod, value) ->
65
- @$node.hasClass($$.blockModClass(@name, mod, value))
@@ -1,56 +0,0 @@
1
- $ ->
2
- $.b = (name) ->
3
- arguments[0] = '.' + name
4
- $.apply(null, arguments)
5
-
6
- originalEq = $.fn.eq;
7
-
8
- $.fn.extend
9
- destroyBlocks: ->
10
- @find($$.bem_class_selector).getBlocks().each ->
11
- @destroy()
12
-
13
- isElem: ->
14
- return true if @e_name
15
- false
16
-
17
- addMod: (name, value) ->
18
- if @isElem()
19
- @addClass($$.elementModClass(@b_name, @e_name, name, value))
20
- else
21
- @addClass($$.blockModClass(@b_name, name, value))
22
-
23
- hasMod: (name, value) ->
24
- if @isElem()
25
- return @hasClass($$.elementModClass(@b_name, @e_name, name, value))
26
- else
27
- return @hasClass($$.blockModClass(@b_name, name, value))
28
-
29
- toggleMod: (mod, value) ->
30
- if @hasMod(mod, value)
31
- @delMod(mod, value)
32
- else
33
- @addMod(mod, value)
34
-
35
- delMod: (name, value) ->
36
- if @isElem()
37
- @removeClass($$.elementModClass(@b_name, @e_name, name, value))
38
- else
39
- @removeClass($$.blockModClass(@b_name, name, value))
40
-
41
- asBlock: (name, o) ->
42
- @addClass("#{name}")
43
- $$.getBlock(@, name, o)
44
-
45
- bemParams: () ->
46
- allParams = @data($$.bemDataKey)
47
- if @isElem()
48
- return allParams[$$.elementClass(@b_name, @e_name)]
49
- else
50
- console.log('Error, only for elements. Use initBlock for blocks.')
51
-
52
- eq: () ->
53
- collection = originalEq.apply(@, arguments)
54
- collection.b_name = @b_name
55
- collection.e_name = @e_name
56
- collection
@@ -1,9 +0,0 @@
1
- window.$$.utils =
2
- _id: 0
3
- camelCase: (input) ->
4
- input.toLowerCase().replace /(^|-)(.)/g, (match, $1, $2) ->
5
- $2.toUpperCase()
6
- dash: (input) ->
7
- input.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
8
- guid: () ->
9
- return @_id++