<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    width="100%" height="100%"
    creationComplete="init()" 
    layout="vertical" xmlns:local="*" horizontalAlign="left" viewSourceURL="srcview/index.html" xmlns:policyHandlers="security.policyHandlers.*">
    <mx:Script>
        <![CDATA[
            import security.policies.AllwaysAppliedPolicy;
            import security.policies.AdminWidgetAccessPolicy;
            import security.User;
            
            [Bindable]
            private var currentUser:User;

            private var userA:User;
            private var userB:User;
                                
            private function init():void {
                userB = new User();
                userB.username = "User B";
                userB.role = "user";
                
                userA = new User();
                userA.username = "User A";
                userA.role = "administrator";
                currentUser = userA;
            }
            /**
             * Callback function for the policy handler. 
             * Applies the policy to correct components making them invisble.
             **/
            public function applyToTargets(b:Boolean):void {
                soDashboard.visible = soDashboard.includeInLayout = b;
            }
        ]]>
    </mx:Script>
    <mx:Label text="Current user: {currentUser.username}, role: {currentUser.role}" />
    <mx:Button click="{currentUser=(currentUser == userA)?userB:userA}" label="Switch User" />
    <!--
        Dashboard component which should only be displayed for Administrators.
    -->
    <policyHandlers:PolicyHandlerImpl id="handler"
        policies="{[AdminWidgetAccessPolicy]}"
        criteria="{currentUser}"
        callback="{applyToTargets}"
        />
    <policyHandlers:PolicyHandlerImpl id="handlerDefaultDashboard"
        policies="{[AllwaysAppliedPolicy]}"
        criteria="{currentUser}"
        callback="{function(b:Boolean):void{someOtherDashboard.includeInLayout = someOtherDashboard.visible = b;}}"
        />
    <local:ApplicationDashboard id="soDashboard"/>
    <!--
        General dashboard component which should only be displayed for all.
    -->
    <local:DefaultDashboard id="someOtherDashboard"/>
</mx:Application>