I recently created my first directive based on jQuery plugin and I asked for review here: http://codereview.stackexchange.com/questions/123519/angular-console-like-window-first-directive I've edited my directive so now instead of `$rootScope` it uses `provider`.<br/> Below is my code: (function() { 'use strict'; angular .module('misiu.providers', []) .provider('simpleConsole', function() { var events = []; var separator = '::'; //default //public methods this.$get = function() { return { addLog: function(data) { addEvent('log', 'Log' + separator + data); }, addError: function(data) { addEvent('error', 'Error' + separator + data); }, clear: function() { events.length = 0; }, events: events }; }; //private method var addEvent = function(type, data) { if (events.length > 0 && events[0].type === type && events[0].data === data) { events[0].count++; } else { events.unshift({ type: type, data: data, count: 1 }); } }; //this is available only in config this.setSeparator = function(value) { separator = value; }; }); angular .module('misiu.directives', ['misiu.providers']) .directive('simpleConsole', ['simpleConsole', function(simpleConsole) { return { restrict: 'E', template: [ '<div class="console animated">', '<div ng-repeat="event in events" ng-class="{\'error\': event.type == \'error\', \'log\': event.type == \'log\'}">', '{{event.data}}<span ng-if="event.count>1" class="count">{{event.count}}</span>', '</div>', '</div>' ].join(''), link: function($scope, element) { $scope.events = simpleConsole.events; } }; }]); })(); and [Plunker][1] to see results. I'd like to ask for review. Especially that provider part, because I'm not sure if all functions in it are correctly declared - private methods should be private, `setSeparator` should be available only in config section and `addLog`,`addError` should be the only two public methods available inside controllers and directives. Any other general tips are welcome. [1]: http://plnkr.co/edit/I7at4TxY6oOefyfj5Uvz?p=preview