public function Action ($strAction = FALSE)
	{
		
		// If an action argument is set
		
		if ($strAction)
		{
			
			// Set it
			
			$this->action	= $strAction;
			
		}
		
		// Else if a method argument is set
		
		else if (isset ($this->args['method']))
		{
			
			// Set it
			
			$this->action	= $this->args['method'];
			
		}
		
		// Auditlog
		
		$auditlog		= \Sonic\Sonic::getResource ('auditlog');
		$logType		= 2; // Default to success
		$logParams		= FALSE;
		$logResponse	= FALSE;
		
		// Explode action
		
		$arrAction	= explode ('.', $this->action);
		
		// If there are 2 or more items then there is a module and permission
		
		if (count ($arrAction) >= 2)
		{
			
			// Set the module and method names

			$strMethod	= array_pop ($arrAction);
			$strModule	= implode ('.', $arrAction);

			// Get the module object

			$objModule	= $this->getModule ($strModule);
			
			// If the module was loaded
			
			if ($objModule)
			{
				
				// If the method exists
				
				if ($objModule->checkMethod ($strMethod))
				{
					
					// Check the method limitation
					
					if ($this->checkLimitation ($strModule, $strMethod))
					{
						
						// Call the method
						
						$arrReturn	= $objModule->callMethod ($this, $strModule, $strMethod, $this->args);
						
						// If the return is ok
						
						if ($arrReturn['status'] == 'ok')
						{
							
							// Set as success
							
							$this->result['status']	= 'ok';
							
							// Remove any result status
							
							unset ($arrReturn['status']);
							
							// Add return
							
							if ($arrReturn)
							{
								
								$this->result[$strMethod]	= $arrReturn;
								
							}
							
							// Auditlog

							$logType		= 2;
//							$logParams		= $this->args;
//							$logResponse	= $this->result;
							
						}
						else
						{
							
							// Set any results
							
							foreach ($arrReturn as $strKey => $strVal)
							{
								
								$this->result[$strKey]	= $strVal;
								
							}
							
							// Auditlog

							$logType		= 3;
							$logParams		= $this->args;
							$logResponse	= @$this->result['message'];
							
						}
						
					}
					
					// Else the module or method is limited
					
					else
					{
						
						// Set error
						
						$this->result['status']		= 'fail';
						$this->result['message']	= 'method access limited';
						
						// Set auditlog type

						$logType = 11;
					
					}
					
				}
				
				// Else the method was not loaded
				
				else
				{
					
					// Set error
					
					$this->result['status']		= 'fail';
					$this->result['message']	= 'invalid method';

					// Set auditlog type

					$logType = 10;

				}
			
			}
			
			// Else the module was not loaded
			
			else
			{
				
				// Set error
				
				$this->result['status']		= 'fail';
				$this->result['message']	= 'invalid module';

				// Set auditlog type
				
				$logType = 9;

			}
			
		}
		
		// Else invalid action format
		
		else
		{
			
			// Set error
			
			$this->result['status']		= 'fail';
			$this->result['message']	= 'invalid action';

			// Set auditlog type

			$logType = 8;

		}
		
		// Set the request and response types and the action
		
		$this->result['method']			= $this->action;
		$this->result['request_type']	= $this->requestType;
		$this->result['return_type']	= $this->returnType;
		
		// Auditlog

		if ($auditlog instanceof Audit\Log)
		{
			$auditlog::_Log ($this->action, $logType, $logParams, $logResponse);
		}
		
		// Return TRUE
		
		return TRUE;
		
	}