01 | 02 | 03 (a, b) | 04 | 05

0

0

0


  <p data-behavior="counter">
    <button data-behavior="increment">+</button>
    <span data-behavior-target="number">0</span>
    <button data-behavior="decrement">-</button>
  </p>
  

  $.behavior( 'counter' ).ifPresent(function( root, $root ) {
    $root.on( 'updateNumber', function(_, number) {
      root.target( 'number' ).text( number );
    });

    var setState = function(value) { this.data( 'state', value ) };
    var getState = function() { return this.data( 'state' ) || 0 };

    var updateNumberWith = function(value) {
      return function() {
        var number = getState.call( $root ) + value;

        setState.call( $root, number );

        $root.trigger( 'updateNumber', number );
      };
    };

    var handleClickAndAdd = function(value) {
      return function() {
        this.on( 'click', updateNumberWith( value ) );
      }
    };

    root.child( 'increment' ).ifPresent( handleClickAndAdd( 1 ) );
    root.child( 'decrement' ).ifPresent( handleClickAndAdd( -1 ) );
  });