@ProLoser $attrs.refresh is a string (ex: "refreshAddresses($select.search)") with function refreshAddresses() being declared by the user on the scope (see [demo.js#L72](https://github.com/angular-ui/ui-select/blob/v0.2.0/examples/demo.js#L72)).
$scope.$apply() performs an [$eval(expr)](http://docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply) that's why it works.

$timeout does perform $apply() but without passing any parameter: [timeout.js#L52](https://github.com/angular/angular.js/blob/v1.3.0-beta.4/src/ng/timeout.js#L52).

$attrs.refresh is like a function pointer as a string. Sounds hackish like this, but it works well.
It is particulary smart, I would not have had the idea myself :)

btw here the current code: [select.js#L185](https://github.com/angular-ui/ui-select/blob/v0.2.0/src/select.js#L185).