var app = angular.module('plunker', []);


function AutoLayoutManagerController() {
	this.layouts = [];
	this.fluentBuilder = new AutoLayoutBuilder();
}

AutoLayoutManagerController.prototype = {
	register: function (layout) {
		this.layouts.push(layout);
	},
	builder: function () {
		console.log('builder', this.layouts);
	  return this.fluentBuilder;
	},
	redraw: function () {
		console.log('redraw', this.layouts);
	}
};



function AutoLayoutBuilder() {
	this.constraints = [];
}

AutoLayoutBuilder.prototype = {
	addRule: function (expressionFn) {
	  var rule = new RuleBuilder();
	  expressionFn(rule);
	  this.constraints.push(rule);
		console.log('rule added: ', rule.toString());
	}
};

function RuleBuilder() {
}



app.controller('IndexPageController', ['$scope', '$timeout', function (scope,
    $timeout) {

		var me = this;
		scope.$watch(function() { return me.autoLayoutManager1; },
		  function(newValue) {
  			if (newValue != null) {
  				// initialize constraints
  				me.autoLayoutManager1.builder()
  					.addRule(function(ruleBuilder) {
  						// ruleBuilder.
  					});
  			}
  		});

    $timeout(function(){
      if(me.autoLayoutManager2){
        me.autoLayoutManager2.redraw();
      }
    }, 5000);

	}])
	.directive('autoLayoutManager', ['$parse', function ($parse) {
		return {
			restrict: 'A',
			require: ['autoLayoutManager'],
			controller: [AutoLayoutManagerController],
			scope: true,
			link: function (scope, element, attr, ctrls) {
				var manager = ctrls[0];
				attr.$observe('autoLayoutManager', function () {
					$parse(attr.autoLayoutManager)
						.assign(scope.$parent, manager);
				});
			}
		};
	}])
	.directive('autoLayout', [function () {
		return {
			restrict: 'A',
			require: ['autoLayout', '^autoLayoutManager'],
			controller: [function () {
				var me = this;
			}],
			controllerAs: 'ctrl',
			scope: {
				name: '@'
			},
			bindToController: true,
			link: function (scope, element, attr, ctrls) {
				var layout = ctrls[0];
				var manager = ctrls[1];

				manager.register(layout);
			}
		};
	}]);
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link href="style.css" rel="stylesheet" />
    <script data-semver="1.3.17" src="https://code.angularjs.org/1.3.17/angular.js" data-require="angular.js@1.3.x"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="IndexPageController as ctrl">
  	<div auto-layout-manager="ctrl.autoLayoutManager1">
  		<div auto-layout name="top" style="background-color:aqua"> top </div>
  		<div auto-layout name="left" style="background-color:chartreuse"> left </div>
  		<div auto-layout name="center" style="background-color:cornflowerblue"> center </div>
  		<div auto-layout name="footer" style="background-color:darksalmon"> footer </div>
  	</div>
  	
  	<div auto-layout-manager="ctrl.autoLayoutManager2">
  		<div auto-layout name="top2" style="background-color:aqua"> top </div>
  		<div auto-layout name="left2" style="background-color:chartreuse"> left </div>
  		<div auto-layout name="center2" style="background-color:cornflowerblue"> center </div>
  		<div auto-layout name="footer2" style="background-color:darksalmon"> footer </div>
  	</div>
  </body>
</html>
/* Put your css in here */