diff --git a/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.php b/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.php index 4561b63..dfc9e9f 100644 --- a/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.php +++ b/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.php @@ -62,7 +62,7 @@ class Placeholder implements ServiceProviderInterface * * @param Container $container The DI container. * - * @return Worker + * @return Reverse * @since 3.2.0 */ public function getPlaceholderReverse(Container $container): Reverse @@ -72,7 +72,8 @@ class Placeholder implements ServiceProviderInterface $container->get('Placeholder'), $container->get('Language'), $container->get('Language.Extractor'), - $container->get('Power.Extractor') + $container->get('Power.Extractor'), + $container->get('Joomla.Power.Extractor') ); } } diff --git a/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.power b/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.power index 1fab397..168c712 100644 --- a/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.power +++ b/src/2f7b1998-bb93-4055-ae82-aa659ce8a37f/code.power @@ -35,7 +35,7 @@ * * @param Container $container The DI container. * - * @return Worker + * @return Reverse * @since 3.2.0 */ public function getPlaceholderReverse(Container $container): Reverse @@ -45,6 +45,7 @@ $container->get('Placeholder'), $container->get('Language'), $container->get('Language.Extractor'), - $container->get('Power.Extractor') + $container->get('Power.Extractor'), + $container->get('Joomla.Power.Extractor') ); } \ No newline at end of file diff --git a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/README.md b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/README.md index 057d43a..9942335 100644 --- a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/README.md +++ b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/README.md @@ -19,9 +19,10 @@ class Customcode #Gold { # Placeholder $placeholder # Extractor $extractor # Power $power + # JoomlaPower $joomla # External $external # $db - + __construct(?Config $config = null, ?Placeholder $placeholder = null, ...) + + __construct(Config $config, Placeholder $placeholder, ...) + update(string $string, int $debug) : string + set(string $string, int $debug, ...) : string + get(?array $ids = null, bool $setLang = true, ...) : bool @@ -36,11 +37,12 @@ note right of Customcode::__construct since: 3.2.0 arguments: - ?Config $config = null - ?Placeholder $placeholder = null - ?Extractor $extractor = null - ?Power $power = null - ?External $external = null + Config $config + Placeholder $placeholder + Extractor $extractor + Power $power + JoomlaPower $joomla + External $external end note note right of Customcode::update diff --git a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.php b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.php index d6d21a4..0bbcae8 100644 --- a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.php +++ b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.php @@ -18,6 +18,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Config; use VDM\Joomla\Componentbuilder\Compiler\Placeholder; use VDM\Joomla\Componentbuilder\Compiler\Language\Extractor; use VDM\Joomla\Componentbuilder\Compiler\Power\Extractor as Power; +use VDM\Joomla\Componentbuilder\Compiler\JoomlaPower\Extractor as JoomlaPower; use VDM\Joomla\Componentbuilder\Compiler\Customcode\External; use VDM\Joomla\Componentbuilder\Compiler\Utilities\Placefix; use VDM\Joomla\Utilities\StringHelper; @@ -111,6 +112,14 @@ class Customcode implements CustomcodeInterface **/ protected Power $power; + /** + * Joomla Power Extractor + * + * @var Power + * @since 3.2.0 + **/ + protected JoomlaPower $joomla; + /** * Compiler Custom Code External * @@ -129,23 +138,25 @@ class Customcode implements CustomcodeInterface /** * Constructor. * - * @param Config|null $config The compiler config object. - * @param Placeholder|null $placeholder The compiler placeholder object. - * @param Extractor|null $extractor The compiler language extractor object. - * @param Power|null $power The compiler power extractor object. - * @param External|null $external The compiler external custom code object. - * @param \JDatabaseDriver $db The Database Driver object. + * @param Config $config The compiler config object. + * @param Placeholder $placeholder The compiler placeholder object. + * @param Extractor $extractor The compiler language extractor object. + * @param Power $power The compiler power extractor object. + * @param JoomlaPower $joomla The compiler joomla power extractor object. + * @param External $external The compiler external custom code object. + * @param \JDatabaseDriver $db The Database Driver object. * * @since 3.2.0 */ - public function __construct(?Config $config = null, ?Placeholder $placeholder = null, - ?Extractor $extractor = null, ?Power $power = null, ?External $external = null) + public function __construct(Config $config, Placeholder $placeholder, + Extractor $extractor, Power $power, JoomlaPower $joomla, External $external) { - $this->config = $config ?: Compiler::_('Config'); - $this->placeholder = $placeholder ?: Compiler::_('Placeholder'); - $this->extractor = $extractor ?: Compiler::_('Language.Extractor'); - $this->power = $power ?: Compiler::_('Power.Extractor'); - $this->external = $external ?: Compiler::_('Customcode.External'); + $this->config = $config; + $this->placeholder = $placeholder; + $this->extractor = $extractor; + $this->power = $power; + $this->joomla = $joomla; + $this->external = $external; $this->db = Factory::getDbo(); } @@ -170,8 +181,9 @@ class Customcode implements CustomcodeInterface ) ); - // extract any found super powers + // extract any found powers $this->power->search($string); + $this->joomla->search($string); } // if debug if ($debug) diff --git a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.power b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.power index 63fd70c..161455c 100644 --- a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.power +++ b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/code.power @@ -76,6 +76,14 @@ **/ protected Power $power; + /** + * Joomla Power Extractor + * + * @var Power + * @since 3.2.0 + **/ + protected JoomlaPower $joomla; + /** * Compiler Custom Code External * @@ -94,23 +102,25 @@ /** * Constructor. * - * @param Config|null $config The compiler config object. - * @param Placeholder|null $placeholder The compiler placeholder object. - * @param Extractor|null $extractor The compiler language extractor object. - * @param Power|null $power The compiler power extractor object. - * @param External|null $external The compiler external custom code object. - * @param \JDatabaseDriver $db The Database Driver object. + * @param Config $config The compiler config object. + * @param Placeholder $placeholder The compiler placeholder object. + * @param Extractor $extractor The compiler language extractor object. + * @param Power $power The compiler power extractor object. + * @param JoomlaPower $joomla The compiler joomla power extractor object. + * @param External $external The compiler external custom code object. + * @param \JDatabaseDriver $db The Database Driver object. * * @since 3.2.0 */ - public function __construct(?Config $config = null, ?Placeholder $placeholder = null, - ?Extractor $extractor = null, ?Power $power = null, ?External $external = null) + public function __construct(Config $config, Placeholder $placeholder, + Extractor $extractor, Power $power, JoomlaPower $joomla, External $external) { - $this->config = $config ?: Compiler::_('Config'); - $this->placeholder = $placeholder ?: Compiler::_('Placeholder'); - $this->extractor = $extractor ?: Compiler::_('Language.Extractor'); - $this->power = $power ?: Compiler::_('Power.Extractor'); - $this->external = $external ?: Compiler::_('Customcode.External'); + $this->config = $config; + $this->placeholder = $placeholder; + $this->extractor = $extractor; + $this->power = $power; + $this->joomla = $joomla; + $this->external = $external; $this->db = Factory::getDbo(); } @@ -135,8 +145,9 @@ ) ); - // extract any found super powers + // extract any found powers $this->power->search($string); + $this->joomla->search($string); } // if debug if ($debug) diff --git a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/settings.json b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/settings.json index be561cd..1236651 100644 --- a/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/settings.json +++ b/src/313b43c4-98c3-4f62-9177-2d73ec8eba31/settings.json @@ -12,43 +12,47 @@ "system_name": "JCB.Compiler.Customcode", "type": "class", "use_selection": { - "use_selection3": { + "use_selection0": { "use": "d910d8b8-4c23-4f3e-8cda-438f2d2bd7ac", "as": "Compiler" }, - "use_selection4": { + "use_selection1": { "use": "fa4bf18e-301e-42e3-91fb-6e0096c07adc", "as": "default" }, - "use_selection5": { + "use_selection2": { "use": "06453ada-e370-49f0-b262-e3f5a8ed0c2c", "as": "default" }, - "use_selection6": { + "use_selection3": { "use": "d33b9278-c409-4aec-a047-b72f56712391", "as": "default" }, - "use_selection7": { + "use_selection4": { "use": "eeb03266-22fd-45bb-953a-961bb6be3a54", "as": "Power" }, - "use_selection8": { + "use_selection5": { + "use": "82505f3f-297f-4d75-a581-929ab3e93689", + "as": "JoomlaPower" + }, + "use_selection6": { "use": "1cef0266-99e2-40d8-919f-c2ce32226b0a", "as": "default" }, - "use_selection9": { + "use_selection7": { "use": "500f3a7f-c16d-4dd4-81b2-2df6776b5388", "as": "default" }, - "use_selection1": { + "use_selection8": { "use": "1f28cb53-60d9-4db1-b517-3c7dc6b429ef", "as": "default" }, - "use_selection0": { + "use_selection9": { "use": "0a59c65c-9daf-4bc9-baf4-e063ff9e6a8a", "as": "default" }, - "use_selection2": { + "use_selection10": { "use": "db87c339-5bb6-4291-a7ef-2c48ea1b06bc", "as": "default" } diff --git a/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.php b/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.php index c703c0d..158c37f 100644 --- a/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.php +++ b/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.php @@ -235,6 +235,10 @@ final class JoomlaPower implements PowerInterface // all powers linked to it $this->state[$guid] = true; + echo '
';
+				var_dump($this->active[$guid]);
+				exit;
+
 				// set the approved super power values
 				$this->setSuperPowers($guid);
 
diff --git a/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.power b/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.power
index d4ff5ae..174cf45 100644
--- a/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.power
+++ b/src/3730a000-ab64-477d-8b0f-70eaf71b517a/code.power
@@ -198,6 +198,10 @@
 				// all powers linked to it
 				$this->state[$guid] = true;
 
+				echo '
';
+				var_dump($this->active[$guid]);
+				exit;
+
 				// set the approved super power values
 				$this->setSuperPowers($guid);
 
diff --git a/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.php b/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.php
index 87f1066..b791bfc 100644
--- a/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.php
+++ b/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.php
@@ -174,16 +174,18 @@ class Router
 
 			// We can only work with ID if the [main get]  is a [getItem] dynamicGet for this site view.
 			$key = ($view['settings']->main_get->gettype == 1) ? 'id' : null;
+			$view_selected = $selection['view'] ?? null;
+			$name_selected = $selection['name'] ?? null;
 
 			// Construct the enriched view object.
 			return (object) [
 				'view' => $view['settings']->code,
 				'View'  => $view['settings']->Code,
-				'stable' => ($selection['view'] === $view['settings']->code), // sanity check
-				'target_view' => $selection['view'],
-				'table' => $selection['table'],
-				'table_name' => $selection['name'],
-				'alias' => $this->getSiteViewAliasKey($selection['name'] ?? null, $adminViews),
+				'stable' => ($view_selected === $view['settings']->code), // sanity check
+				'target_view' => $view_selected,
+				'table' => $selection['table'] ?? null,
+				'table_name' => $name_selected,
+				'alias' => $this->getSiteViewAliasKey($name_selected, $adminViews),
 				'key' => $key,
 				'form' => false
 			];
diff --git a/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.power b/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.power
index 6950b1e..f4cea58 100644
--- a/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.power
+++ b/src/402239e6-ceec-4ee0-af62-22d462417bf6/code.power
@@ -145,16 +145,18 @@
 
 			// We can only work with ID if the [main get]  is a [getItem] dynamicGet for this site view.
 			$key = ($view['settings']->main_get->gettype == 1) ? 'id' : null;
+			$view_selected = $selection['view'] ?? null;
+			$name_selected = $selection['name'] ?? null;
 
 			// Construct the enriched view object.
 			return (object) [
 				'view' => $view['settings']->code,
 				'View'  => $view['settings']->Code,
-				'stable' => ($selection['view'] === $view['settings']->code), // sanity check
-				'target_view' => $selection['view'],
-				'table' => $selection['table'],
-				'table_name' => $selection['name'],
-				'alias' => $this->getSiteViewAliasKey($selection['name'] ?? null, $adminViews),
+				'stable' => ($view_selected === $view['settings']->code), // sanity check
+				'target_view' => $view_selected,
+				'table' => $selection['table'] ?? null,
+				'table_name' => $name_selected,
+				'alias' => $this->getSiteViewAliasKey($name_selected, $adminViews),
 				'key' => $key,
 				'form' => false
 			];
diff --git a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/README.md b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/README.md
index 18d23bf..186a359 100644
--- a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/README.md
+++ b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/README.md
@@ -12,44 +12,10 @@
 ```uml
 @startuml
 class Injector << (F,LightGreen) >> #RoyalBlue {
-  # update(array $guids, string $code) : string
-  # inspect(object $power, ?array $useStatements, ...) : ?string
   # buildNamespaceStatment(object $power) : string
-  # extractUseStatements(string $useStatement, string $className, ...) : array
-  # isUseStatementEqual(string $useStatement, string $namespaceStatement) : bool
-  # extractClassNameOrAlias(string $useStatement) : ?string
   # getUniqueName(string $name, object $power) : string
-  # extractLastNameFromNamespace(string $namespace) : ?string
-  # removeLastNameFromNamespace(string $namespace) : string
-  # shouldAddTraitStatement(object $power) : bool
-  # handleTraitLogic(string $name, object $power, ...) : void
-  # addUseStatement(string $name, string $className, ...) : void
-  # addUseStatements(string $code, ?array $useStatements) : string
-  # addLines(string $code, string $lines) : string
-  # addLinesAfterDefinedLine(string $code, string $lines) : string
 }
 
-note right of Injector::update
-  Update the code
-
-  since: 3.2.0
-  return: string
-end note
-
-note left of Injector::inspect
-  Inspect the super power to determine the necessary class name based on use statements and traits.
-It checks if the given power (class, trait, etc.) already has a corresponding use statement
-and handles the naming accordingly to avoid conflicts.
-
-  since: 3.2.0
-  return: ?string
-  
-  arguments:
-    object $power
-    ?array $useStatements
-    ?array $traits
-end note
-
 note right of Injector::buildNamespaceStatment
   Builds the namespace statement from the power object's namespace and class name.
 
@@ -57,112 +23,12 @@ note right of Injector::buildNamespaceStatment
   return: string
 end note
 
-note left of Injector::extractUseStatements
-  Extracts and processes use statements to find if the current class name is already used.
-It identifies any potential naming conflicts.
-
-  since: 3.2.0
-  return: array
-  
-  arguments:
-    string $useStatement
-    string $className
-    ?array $useStatements
-end note
-
-note right of Injector::isUseStatementEqual
-  Checks if the namespace statement is already declared in the current use statements.
-This method uses a regular expression to check for an exact match of the full statement,
-taking into account the possibility of an alias being used.
-
-  return: bool
-end note
-
-note left of Injector::extractClassNameOrAlias
-  Extracts the class name or alias from a use statement.
-This method parses a PHP 'use' statement and extracts either the class name or its alias.
-If the statement doesn't match the expected format, or if no class name or alias is found,
-the method returns null.
-Example:
-- 'use Namespace\ClassName;' -> returns 'ClassName'
-- 'use Namespace\ClassName as Alias;' -> returns 'Alias'
-
-  since: 3.2.0
-  return: ?string
-end note
-
 note right of Injector::getUniqueName
   Ensures the name for the use statement is unique, avoiding conflicts with other classes.
 
   since: 3.2.0
   return: string
 end note
-
-note left of Injector::extractLastNameFromNamespace
-  Extracts the last part of a namespace string, which is typically the class name.
-
-  since: 3.2.0
-  return: ?string
-end note
-
-note right of Injector::removeLastNameFromNamespace
-  Removes the last name from the namespace.
-
-  since: 3.2.0
-  return: string
-end note
-
-note left of Injector::shouldAddTraitStatement
-  Determines whether a trait statement should be added.
-
-  since: 3.2.0
-  return: bool
-end note
-
-note right of Injector::handleTraitLogic
-  Handles specific logic for traits, such as checking if the trait is already used.
-
-  since: 3.2.0
-  return: void
-  
-  arguments:
-    string $name
-    object $power
-    ?array $traits
-end note
-
-note left of Injector::addUseStatement
-  Adds a use statement to the class if it's not already present.
-
-  since: 3.2.0
-  return: void
-  
-  arguments:
-    string $name
-    string $className
-    string $namespaceStatement
-end note
-
-note right of Injector::addUseStatements
-  Insert a line before the class declaration in the given class code.
-
-  since: 3.2.0
-  return: string
-end note
-
-note left of Injector::addLines
-  Insert a line before the class declaration in the given class code.
-
-  since: 3.2.0
-  return: string
-end note
-
-note right of Injector::addLinesAfterDefinedLine
-  Inserts a new line after the defined('_JEXEC') line.
-
-  since: 3.2.0
-  return: string
-end note
  
 @enduml
 ```
diff --git a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.php b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.php
index 55a58ce..6c4baf9 100644
--- a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.php
+++ b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.php
@@ -22,86 +22,6 @@ use VDM\Joomla\Componentbuilder\Compiler\Power\Injector as ExtendingInjector;
  */
 final class Injector extends ExtendingInjector implements InjectorInterface
 {
-	/**
-	 * Update the code
-	 *
-	 * @param array   $guids The Power guids found
-	 * @param string   $code The class code
-	 *
-	 * @return string   The updated code
-	 * @since 3.2.0
-	 */
-	protected function update(array $guids, string $code): string
-	{
-		$use_statements = $this->parser->getUseStatements($code);
-		$traits = $this->parser->getTraits(
-			$this->parser->getClassCode($code) ?? ''
-		);
-
-		// reset with each file
-		$this->map = [];
-		$this->useStatements = [];
-		$this->traits = [];
-		$this->other = [];
-		$this->duplicate = [];
-
-		foreach ($guids as $key => $guid)
-		{
-			if  (($power = $this->power->get($guid)) !== null)
-			{
-				if (($name = $this->inspect($power, $use_statements, $traits)) !== null)
-				{
-					$this->map[$key] = $name;
-				}
-			}
-		}
-
-		// update
-		if ($this->map !== [])
-		{
-			if ($this->useStatements !== [])
-			{
-				$code = $this->addUseStatements($code, $use_statements);
-			}
-
-			return $this->placeholder->update($code, $this->map);
-		}
-
-		return $code;
-	}
-
-	/**
-	 * Inspect the super power to determine the necessary class name based on use statements and traits.
-	 * It checks if the given power (class, trait, etc.) already has a corresponding use statement
-	 * and handles the naming accordingly to avoid conflicts.
-	 *
-	 * @param object      $power           The power object containing type, namespace, and class name.
-	 * @param array|null  $useStatements   Array of existing use statements in the code.
-	 * @param array|null  $traits          Array of existing traits used in the code.
-	 *
-	 * @return string|null The determined class name, or null if the type is not valid.
-	 * @since 3.2.0
-	 */
-	protected function inspect(object $power, ?array $useStatements, ?array $traits): ?string
-	{
-		$namespaceStatement = $this->buildNamespaceStatment($power);
-
-		$use_extracted = $this->extractUseStatements($namespaceStatement, $power->class_name, $useStatements);
-
-		$name = $use_extracted['found'] ?? $power->class_name;
-
-		$name = $this->getUniqueName($name, $power);
-
-		$this->handleTraitLogic($name, $power, $traits);
-
-		if (!$use_extracted['hasStatement'])
-		{
-			$this->addUseStatement($name, $power->class_name, $namespaceStatement);
-		}
-
-		return $name;
-	}
-
 	/**
 	 * Builds the namespace statement from the power object's namespace and class name.
 	 *
@@ -115,109 +35,6 @@ final class Injector extends ExtendingInjector implements InjectorInterface
 		return $power->_namespace . '\\' . $power->class_name;
 	}
 
-	/**
-	 * Extracts and processes use statements to find if the current class name is already used.
-	 * It identifies any potential naming conflicts.
-	 *
-	 * @param string      $useStatement     The search statement of the current class.
-	 * @param string      $className         The class name of the power object.
-	 * @param array|null  $useStatements     The existing use statements.
-	 *
-	 * @return array  An array with keys 'found' and 'hasStatement'.
-	 * @since 3.2.0
-	 */
-	protected function extractUseStatements(string $useStatement, string $className, ?array $useStatements): array
-	{
-		$results = ['found' => null, 'hasStatement' => false];
-
-		if ($useStatements !== null)
-		{
-			foreach ($useStatements as $use_statement)
-			{
-				$class_name = $this->extractClassNameOrAlias($use_statement);
-
-				if ($this->isUseStatementEqual($use_statement, $useStatement))
-				{
-					if ($results['found'] === null)
-					{
-						$results['found'] = $class_name;
-						$results['hasStatement'] = true;
-					}
-					else
-					{
-						// TODO we need to backport fix these
-						$this->duplicate[$use_statement] = $class_name;
-					}
-				}
-				elseif ($className === $class_name)
-				{
-					$this->other[$className] = $class_name;
-				}
-			}
-		}
-
-		return $results;
-	}
-
-	/**
-	 * Checks if the namespace statement is already declared in the current use statements.
-	 *
-	 * This method uses a regular expression to check for an exact match of the full statement,
-	 * taking into account the possibility of an alias being used.
-	 *
-	 * @param string  $useStatement     The existing use statement to check against.
-	 * @param string  $namespaceStatement  The search statement to search for (without the trailing semicolon, or use prefix).
-	 *
-	 * @return bool True if the full statement is found, false otherwise.
-	 */
-	protected function isUseStatementEqual(string $useStatement, string $namespaceStatement): bool
-	{
-		// Create a regular expression pattern to match the full statement
-		// The pattern checks for the start of the statement, optional whitespace,
-		// and an optional alias after the full statement.
-		$pattern = '/^use\s+' . preg_quote($namespaceStatement, '/') . '(?:\s+as\s+\w+)?;$/';
-
-		// Perform the regex match to check if the use statement is equal to the search statment
-		return (bool) preg_match($pattern, $useStatement);
-	}
-
-	/**
-	 * Extracts the class name or alias from a use statement.
-	 *
-	 * This method parses a PHP 'use' statement and extracts either the class name or its alias.
-	 * If the statement doesn't match the expected format, or if no class name or alias is found,
-	 * the method returns null.
-	 *
-	 * Example: 
-	 * - 'use Namespace\ClassName;' -> returns 'ClassName'
-	 * - 'use Namespace\ClassName as Alias;' -> returns 'Alias'
-	 *
-	 * @param string  $useStatement  The use statement from which to extract the class name or alias.
-	 *
-	 * @return string|null The class name or alias if found, null otherwise.
-	 * @since 3.2.0
-	 */
-	protected function extractClassNameOrAlias(string $useStatement): ?string
-	{
-		// If the input doesn't start with 'use ', assume it's just the namespace without a use statement
-		if (strpos($useStatement, 'use ') !== 0)
-		{
-			return $this->extractLastNameFromNamespace($useStatement);
-		}
-
-		// Regular expression to extract the class name and alias from the use statement
-		$pattern = '/use\s+(?P[\w\\\\]+?)(?:\s+as\s+(?P\w+))?;/';
-
-		if (preg_match($pattern, $useStatement, $matches))
-		{
-			// Return the alias if it exists; otherwise, return the last part of the namespace (class name)
-			return $matches['alias'] ?? $this->extractLastNameFromNamespace($matches['namespace']);
-		}
-
-		// Return null if no match is found
-		return null;
-	}
-
 	/**
 	 * Ensures the name for the use statement is unique, avoiding conflicts with other classes.
 	 *
@@ -269,236 +86,6 @@ final class Injector extends ExtendingInjector implements InjectorInterface
 		}
 
 		return $name;
-	}
-
-	/**
-	 * Extracts the last part of a namespace string, which is typically the class name.
-	 *
-	 * @param string $namespace  The namespace string to extract from.
-	 *
-	 * @return string|null The extracted class name.
-	 * @since 3.2.0
-	 */
-	protected function extractLastNameFromNamespace(string $namespace): ?string
-	{
-		$parts = explode('\\', $namespace);
-		$result = end($parts);
-
-		// Remove '\\' from the beginning and end of the resulting string
-		$result = trim($result, '\\');
-
-		// If the resulting string is empty, return null
-		return empty($result) ? null : $result;
-	}
-
-	/**
-	 * Removes the last name from the namespace.
-	 *
-	 * @param string $namespace The namespace
-	 *
-	 * @return string The namespace shortened
-	 * @since 3.2.0
-	 */
-	protected function removeLastNameFromNamespace(string $namespace): string
-	{
-		// Remove '\\' from the beginning and end of the resulting string
-		$namespace = trim($namespace, '\\');
-
-		$parts = explode('\\', $namespace);
-
-		// Remove the last part (the class name)
-		array_pop($parts);
-
-		// Reassemble the namespace without the class name
-		return implode('\\', $parts);
-	}
-
-	/**
-	 * Determines whether a trait statement should be added.
-	 *
-	 * @param object $power The power object.
-	 *
-	 * @return bool True if a trait statement should be added, false otherwise.
-	 * @since 3.2.0
-	 */
-	protected function shouldAddTraitStatement(object $power): bool
-	{
-		return $power->type === 'trait';
-	}
-
-	/**
-	 * Handles specific logic for traits, such as checking if the trait is already used.
-	 *
-	 * @param string      $name    The current name.
-	 * @param object      $power   The power object containing type, namespace, and class name.
-	 * @param array|null  $traits  The traits used in the code.
-	 *
-	 * @return void
-	 * @since 3.2.0
-	 */
-	protected function handleTraitLogic(string $name, object $power, ?array $traits): void
-	{
-		if ($this->shouldAddTraitStatement($power) && $traits !== null)
-		{
-			foreach ($traits as $trait)
-			{
-				if ($trait === $name)
-				{
-					return;
-				}
-			}
-		}
-
-		// add the trait
-		$this->traits[$name] = 'use ' . $name . ';';
-	}
-
-	/**
-	 * Adds a use statement to the class if it's not already present.
-	 *
-	 * @param string  $name                The name to use.
-	 * @param string  $className           The class name of the power object.
-	 * @param string  $namespaceStatement  The search statement to search for (without the trailing semicolon, or use prefix).
-	 *
-	 * @since 3.2.0
-	 */
-	protected function addUseStatement(string &$name, string $className, string $namespaceStatement): void
-	{
-		if ($name !== $className)
-		{
-			$statement = 'use ' . $namespaceStatement . ' as ' . $name . ';';
-		}
-		else
-		{
-			$statement = 'use ' . $namespaceStatement . ';';
-		}
-
-		$this->useStatements[$name] = $statement;
-	}
-
-	/**
-	 * Insert a line before the class declaration in the given class code.
-	 *
-	 * @param string       $code             The class code
-	 * @param array|null   $useStatements    The existing use statements
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addUseStatements(string $code, ?array $useStatements): string
-	{
-		if ($useStatements !== null)
-		{
-			// we add the use statements using existing use statements
-			$key = end($useStatements);
-
-			array_unshift($this->useStatements, $key);
-
-			return $this->placeholder->update($code, [$key => implode(PHP_EOL, array_values($this->useStatements))]);
-		}
-
-		return $this->addLines($code, implode(PHP_EOL, array_values($this->useStatements)));
-	}
-
-	/**
-	 * Insert a line before the class declaration in the given class code.
-	 *
-	 * @param string   $code     The class code
-	 * @param string   $lines    The new lines to insert
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addLines(string $code, string $lines): string
-	{
-		// Pattern to match class, final class, abstract class, interface, and trait
-		$pattern = '/(?:class|final class|abstract class|interface|trait)\s+[a-zA-Z0-9_]+\s*(?:extends\s+[a-zA-Z0-9_]+\s*)?(?:implements\s+[a-zA-Z0-9_]+(?:\s*,\s*[a-zA-Z0-9_]+)*)?\s*\{/s';
-
-		// Find the position of the class declaration
-		preg_match($pattern, $code, $matches, PREG_OFFSET_CAPTURE);
-		$class_declaration_pos = $matches[0][1] ?? null;
-
-		if (null !== $class_declaration_pos)
-		{
-			// Find the position of the last newline character before the class declaration
-			$last_newline_pos = strrpos($code, PHP_EOL, -(strlen($code) - $class_declaration_pos));
-
-			// Find the position of the comment block right before the class declaration
-			$comment_pattern = '/\s*\*\/\s*$/m';
-			$insert_pos = null;
-			if (preg_match($comment_pattern, $code, $comment_matches, PREG_OFFSET_CAPTURE, $last_newline_pos))
-			{
-				$insert_pos = (int) $comment_matches[0][1] + strlen($comment_matches[0][0]);
-			}
-			else
-			{
-				// Find the last empty line before the class declaration
-				$empty_line_pattern = '/(^|\r\n|\r|\n)[\s]*($|\r\n|\r|\n)/';
-				if (preg_match($empty_line_pattern, $code, $empty_line_matches, PREG_OFFSET_CAPTURE, $last_newline_pos))
-				{
-					$insert_pos = (int) $empty_line_matches[0][1] + strlen($empty_line_matches[0][0]);
-				}
-			}
-
-			// Insert the new line at the found position
-			if (null !== $insert_pos)
-			{
-				return substr_replace($code, $lines . PHP_EOL, $insert_pos, 0);
-			}
-		}
-
-		// last try targeting the defined line
-		return $this->addLinesAfterDefinedLine($code, $lines);
-	}
-
-	/**
-	 * Inserts a new line after the defined('_JEXEC') line.
-	 *
-	 * @param string   $code     The class code
-	 * @param string   $lines    The new lines to insert
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addLinesAfterDefinedLine(string $code, string $lines): string
-	{
-		// Patterns to match the defined('_JEXEC') and defined('JPATH_BASE') lines
-		$patterns = [
-			"/defined\('_JEXEC'\)(.*?)\s*;/",
-			"/\\defined\('_JEXEC'\)(.*?)\s*;/",
-			"/defined\('JPATH_BASE'\)(.*?)\s*;/",
-			"/\\defined\('JPATH_BASE'\)(.*?)\s*;/",
-		];
-
-		$insert_pos = null;
-
-		// Iterate through the patterns and try to find a match
-		foreach ($patterns as $pattern)
-		{
-			preg_match($pattern, $code, $matches, PREG_OFFSET_CAPTURE);
-			$defined_line_pos = $matches[0][1] ?? null;
-
-			if ($defined_line_pos !== null)
-			{
-				// Find the position of the newline character after the defined() line
-				$next_lines_pos = strpos($code, PHP_EOL, (int) $defined_line_pos + strlen($matches[0][0]));
-
-				// Insert the new line at the found position
-				if ($next_lines_pos !== false)
-				{
-					$insert_pos = $next_lines_pos;
-					break;
-				}
-			}
-		}
-
-		// Insert the new line at the found position
-		if ($insert_pos !== null)
-		{
-			$code = substr_replace($code, PHP_EOL . $lines, $insert_pos, 0);
-		}
-
-		return $code;
 	}
 }
 
diff --git a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.power b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.power
index 04b1b6d..dd5cdb9 100644
--- a/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.power
+++ b/src/a6052fe9-0d2b-4b36-b3e7-03b47c483542/code.power
@@ -1,83 +1,3 @@
-	/**
-	 * Update the code
-	 *
-	 * @param array   $guids The Power guids found
-	 * @param string   $code The class code
-	 *
-	 * @return string   The updated code
-	 * @since 3.2.0
-	 */
-	protected function update(array $guids, string $code): string
-	{
-		$use_statements = $this->parser->getUseStatements($code);
-		$traits = $this->parser->getTraits(
-			$this->parser->getClassCode($code) ?? ''
-		);
-
-		// reset with each file
-		$this->map = [];
-		$this->useStatements = [];
-		$this->traits = [];
-		$this->other = [];
-		$this->duplicate = [];
-
-		foreach ($guids as $key => $guid)
-		{
-			if  (($power = $this->power->get($guid)) !== null)
-			{
-				if (($name = $this->inspect($power, $use_statements, $traits)) !== null)
-				{
-					$this->map[$key] = $name;
-				}
-			}
-		}
-
-		// update
-		if ($this->map !== [])
-		{
-			if ($this->useStatements !== [])
-			{
-				$code = $this->addUseStatements($code, $use_statements);
-			}
-
-			return $this->placeholder->update($code, $this->map);
-		}
-
-		return $code;
-	}
-
-	/**
-	 * Inspect the super power to determine the necessary class name based on use statements and traits.
-	 * It checks if the given power (class, trait, etc.) already has a corresponding use statement
-	 * and handles the naming accordingly to avoid conflicts.
-	 *
-	 * @param object      $power           The power object containing type, namespace, and class name.
-	 * @param array|null  $useStatements   Array of existing use statements in the code.
-	 * @param array|null  $traits          Array of existing traits used in the code.
-	 *
-	 * @return string|null The determined class name, or null if the type is not valid.
-	 * @since 3.2.0
-	 */
-	protected function inspect(object $power, ?array $useStatements, ?array $traits): ?string
-	{
-		$namespaceStatement = $this->buildNamespaceStatment($power);
-
-		$use_extracted = $this->extractUseStatements($namespaceStatement, $power->class_name, $useStatements);
-
-		$name = $use_extracted['found'] ?? $power->class_name;
-
-		$name = $this->getUniqueName($name, $power);
-
-		$this->handleTraitLogic($name, $power, $traits);
-
-		if (!$use_extracted['hasStatement'])
-		{
-			$this->addUseStatement($name, $power->class_name, $namespaceStatement);
-		}
-
-		return $name;
-	}
-
 	/**
 	 * Builds the namespace statement from the power object's namespace and class name.
 	 *
@@ -91,109 +11,6 @@
 		return $power->_namespace . '\\' . $power->class_name;
 	}
 
-	/**
-	 * Extracts and processes use statements to find if the current class name is already used.
-	 * It identifies any potential naming conflicts.
-	 *
-	 * @param string      $useStatement     The search statement of the current class.
-	 * @param string      $className         The class name of the power object.
-	 * @param array|null  $useStatements     The existing use statements.
-	 *
-	 * @return array  An array with keys 'found' and 'hasStatement'.
-	 * @since 3.2.0
-	 */
-	protected function extractUseStatements(string $useStatement, string $className, ?array $useStatements): array
-	{
-		$results = ['found' => null, 'hasStatement' => false];
-
-		if ($useStatements !== null)
-		{
-			foreach ($useStatements as $use_statement)
-			{
-				$class_name = $this->extractClassNameOrAlias($use_statement);
-
-				if ($this->isUseStatementEqual($use_statement, $useStatement))
-				{
-					if ($results['found'] === null)
-					{
-						$results['found'] = $class_name;
-						$results['hasStatement'] = true;
-					}
-					else
-					{
-						// TODO we need to backport fix these
-						$this->duplicate[$use_statement] = $class_name;
-					}
-				}
-				elseif ($className === $class_name)
-				{
-					$this->other[$className] = $class_name;
-				}
-			}
-		}
-
-		return $results;
-	}
-
-	/**
-	 * Checks if the namespace statement is already declared in the current use statements.
-	 *
-	 * This method uses a regular expression to check for an exact match of the full statement,
-	 * taking into account the possibility of an alias being used.
-	 *
-	 * @param string  $useStatement     The existing use statement to check against.
-	 * @param string  $namespaceStatement  The search statement to search for (without the trailing semicolon, or use prefix).
-	 *
-	 * @return bool True if the full statement is found, false otherwise.
-	 */
-	protected function isUseStatementEqual(string $useStatement, string $namespaceStatement): bool
-	{
-		// Create a regular expression pattern to match the full statement
-		// The pattern checks for the start of the statement, optional whitespace,
-		// and an optional alias after the full statement.
-		$pattern = '/^use\s+' . preg_quote($namespaceStatement, '/') . '(?:\s+as\s+\w+)?;$/';
-
-		// Perform the regex match to check if the use statement is equal to the search statment
-		return (bool) preg_match($pattern, $useStatement);
-	}
-
-	/**
-	 * Extracts the class name or alias from a use statement.
-	 *
-	 * This method parses a PHP 'use' statement and extracts either the class name or its alias.
-	 * If the statement doesn't match the expected format, or if no class name or alias is found,
-	 * the method returns null.
-	 *
-	 * Example: 
-	 * - 'use Namespace\ClassName;' -> returns 'ClassName'
-	 * - 'use Namespace\ClassName as Alias;' -> returns 'Alias'
-	 *
-	 * @param string  $useStatement  The use statement from which to extract the class name or alias.
-	 *
-	 * @return string|null The class name or alias if found, null otherwise.
-	 * @since 3.2.0
-	 */
-	protected function extractClassNameOrAlias(string $useStatement): ?string
-	{
-		// If the input doesn't start with 'use ', assume it's just the namespace without a use statement
-		if (strpos($useStatement, 'use ') !== 0)
-		{
-			return $this->extractLastNameFromNamespace($useStatement);
-		}
-
-		// Regular expression to extract the class name and alias from the use statement
-		$pattern = '/use\s+(?P[\w\\\\]+?)(?:\s+as\s+(?P\w+))?;/';
-
-		if (preg_match($pattern, $useStatement, $matches))
-		{
-			// Return the alias if it exists; otherwise, return the last part of the namespace (class name)
-			return $matches['alias'] ?? $this->extractLastNameFromNamespace($matches['namespace']);
-		}
-
-		// Return null if no match is found
-		return null;
-	}
-
 	/**
 	 * Ensures the name for the use statement is unique, avoiding conflicts with other classes.
 	 *
@@ -245,234 +62,4 @@
 		}
 
 		return $name;
-	}
-
-	/**
-	 * Extracts the last part of a namespace string, which is typically the class name.
-	 *
-	 * @param string $namespace  The namespace string to extract from.
-	 *
-	 * @return string|null The extracted class name.
-	 * @since 3.2.0
-	 */
-	protected function extractLastNameFromNamespace(string $namespace): ?string
-	{
-		$parts = explode('\\', $namespace);
-		$result = end($parts);
-
-		// Remove '\\' from the beginning and end of the resulting string
-		$result = trim($result, '\\');
-
-		// If the resulting string is empty, return null
-		return empty($result) ? null : $result;
-	}
-
-	/**
-	 * Removes the last name from the namespace.
-	 *
-	 * @param string $namespace The namespace
-	 *
-	 * @return string The namespace shortened
-	 * @since 3.2.0
-	 */
-	protected function removeLastNameFromNamespace(string $namespace): string
-	{
-		// Remove '\\' from the beginning and end of the resulting string
-		$namespace = trim($namespace, '\\');
-
-		$parts = explode('\\', $namespace);
-
-		// Remove the last part (the class name)
-		array_pop($parts);
-
-		// Reassemble the namespace without the class name
-		return implode('\\', $parts);
-	}
-
-	/**
-	 * Determines whether a trait statement should be added.
-	 *
-	 * @param object $power The power object.
-	 *
-	 * @return bool True if a trait statement should be added, false otherwise.
-	 * @since 3.2.0
-	 */
-	protected function shouldAddTraitStatement(object $power): bool
-	{
-		return $power->type === 'trait';
-	}
-
-	/**
-	 * Handles specific logic for traits, such as checking if the trait is already used.
-	 *
-	 * @param string      $name    The current name.
-	 * @param object      $power   The power object containing type, namespace, and class name.
-	 * @param array|null  $traits  The traits used in the code.
-	 *
-	 * @return void
-	 * @since 3.2.0
-	 */
-	protected function handleTraitLogic(string $name, object $power, ?array $traits): void
-	{
-		if ($this->shouldAddTraitStatement($power) && $traits !== null)
-		{
-			foreach ($traits as $trait)
-			{
-				if ($trait === $name)
-				{
-					return;
-				}
-			}
-		}
-
-		// add the trait
-		$this->traits[$name] = 'use ' . $name . ';';
-	}
-
-	/**
-	 * Adds a use statement to the class if it's not already present.
-	 *
-	 * @param string  $name                The name to use.
-	 * @param string  $className           The class name of the power object.
-	 * @param string  $namespaceStatement  The search statement to search for (without the trailing semicolon, or use prefix).
-	 *
-	 * @since 3.2.0
-	 */
-	protected function addUseStatement(string &$name, string $className, string $namespaceStatement): void
-	{
-		if ($name !== $className)
-		{
-			$statement = 'use ' . $namespaceStatement . ' as ' . $name . ';';
-		}
-		else
-		{
-			$statement = 'use ' . $namespaceStatement . ';';
-		}
-
-		$this->useStatements[$name] = $statement;
-	}
-
-	/**
-	 * Insert a line before the class declaration in the given class code.
-	 *
-	 * @param string       $code             The class code
-	 * @param array|null   $useStatements    The existing use statements
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addUseStatements(string $code, ?array $useStatements): string
-	{
-		if ($useStatements !== null)
-		{
-			// we add the use statements using existing use statements
-			$key = end($useStatements);
-
-			array_unshift($this->useStatements, $key);
-
-			return $this->placeholder->update($code, [$key => implode(PHP_EOL, array_values($this->useStatements))]);
-		}
-
-		return $this->addLines($code, implode(PHP_EOL, array_values($this->useStatements)));
-	}
-
-	/**
-	 * Insert a line before the class declaration in the given class code.
-	 *
-	 * @param string   $code     The class code
-	 * @param string   $lines    The new lines to insert
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addLines(string $code, string $lines): string
-	{
-		// Pattern to match class, final class, abstract class, interface, and trait
-		$pattern = '/(?:class|final class|abstract class|interface|trait)\s+[a-zA-Z0-9_]+\s*(?:extends\s+[a-zA-Z0-9_]+\s*)?(?:implements\s+[a-zA-Z0-9_]+(?:\s*,\s*[a-zA-Z0-9_]+)*)?\s*\{/s';
-
-		// Find the position of the class declaration
-		preg_match($pattern, $code, $matches, PREG_OFFSET_CAPTURE);
-		$class_declaration_pos = $matches[0][1] ?? null;
-
-		if (null !== $class_declaration_pos)
-		{
-			// Find the position of the last newline character before the class declaration
-			$last_newline_pos = strrpos($code, PHP_EOL, -(strlen($code) - $class_declaration_pos));
-
-			// Find the position of the comment block right before the class declaration
-			$comment_pattern = '/\s*\*\/\s*$/m';
-			$insert_pos = null;
-			if (preg_match($comment_pattern, $code, $comment_matches, PREG_OFFSET_CAPTURE, $last_newline_pos))
-			{
-				$insert_pos = (int) $comment_matches[0][1] + strlen($comment_matches[0][0]);
-			}
-			else
-			{
-				// Find the last empty line before the class declaration
-				$empty_line_pattern = '/(^|\r\n|\r|\n)[\s]*($|\r\n|\r|\n)/';
-				if (preg_match($empty_line_pattern, $code, $empty_line_matches, PREG_OFFSET_CAPTURE, $last_newline_pos))
-				{
-					$insert_pos = (int) $empty_line_matches[0][1] + strlen($empty_line_matches[0][0]);
-				}
-			}
-
-			// Insert the new line at the found position
-			if (null !== $insert_pos)
-			{
-				return substr_replace($code, $lines . PHP_EOL, $insert_pos, 0);
-			}
-		}
-
-		// last try targeting the defined line
-		return $this->addLinesAfterDefinedLine($code, $lines);
-	}
-
-	/**
-	 * Inserts a new line after the defined('_JEXEC') line.
-	 *
-	 * @param string   $code     The class code
-	 * @param string   $lines    The new lines to insert
-	 *
-	 * @return string The modified file content
-	 * @since 3.2.0
-	 */
-	protected function addLinesAfterDefinedLine(string $code, string $lines): string
-	{
-		// Patterns to match the defined('_JEXEC') and defined('JPATH_BASE') lines
-		$patterns = [
-			"/defined\('_JEXEC'\)(.*?)\s*;/",
-			"/\\defined\('_JEXEC'\)(.*?)\s*;/",
-			"/defined\('JPATH_BASE'\)(.*?)\s*;/",
-			"/\\defined\('JPATH_BASE'\)(.*?)\s*;/",
-		];
-
-		$insert_pos = null;
-
-		// Iterate through the patterns and try to find a match
-		foreach ($patterns as $pattern)
-		{
-			preg_match($pattern, $code, $matches, PREG_OFFSET_CAPTURE);
-			$defined_line_pos = $matches[0][1] ?? null;
-
-			if ($defined_line_pos !== null)
-			{
-				// Find the position of the newline character after the defined() line
-				$next_lines_pos = strpos($code, PHP_EOL, (int) $defined_line_pos + strlen($matches[0][0]));
-
-				// Insert the new line at the found position
-				if ($next_lines_pos !== false)
-				{
-					$insert_pos = $next_lines_pos;
-					break;
-				}
-			}
-		}
-
-		// Insert the new line at the found position
-		if ($insert_pos !== null)
-		{
-			$code = substr_replace($code, PHP_EOL . $lines, $insert_pos, 0);
-		}
-
-		return $code;
 	}
\ No newline at end of file
diff --git a/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.php b/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.php
index f33011f..c4bd7dc 100644
--- a/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.php
+++ b/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.php
@@ -82,6 +82,7 @@ class Customcode implements ServiceProviderInterface
 			$container->get('Placeholder'),
 			$container->get('Language.Extractor'),
 			$container->get('Power.Extractor'),
+			$container->get('Joomla.Power.Extractor'),
 			$container->get('Customcode.External')
 		);
 	}
diff --git a/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.power b/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.power
index cd12dba..a608e6b 100644
--- a/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.power
+++ b/src/a74ac3b7-bb79-4639-8f14-54a8021be68b/code.power
@@ -48,6 +48,7 @@
 			$container->get('Placeholder'),
 			$container->get('Language.Extractor'),
 			$container->get('Power.Extractor'),
+			$container->get('Joomla.Power.Extractor'),
 			$container->get('Customcode.External')
 		);
 	}
diff --git a/src/ca111518-e47c-4049-b1b2-cb010f23866f/README.md b/src/ca111518-e47c-4049-b1b2-cb010f23866f/README.md
index 56d6f0b..ff3cd6d 100644
--- a/src/ca111518-e47c-4049-b1b2-cb010f23866f/README.md
+++ b/src/ca111518-e47c-4049-b1b2-cb010f23866f/README.md
@@ -16,11 +16,13 @@ class Reverse  #Gold {
   # Language $language
   # Extractor $extractor
   # Power $power
-  + __construct(?Config $config = null, ?Placeholder $placeholder = null, ...)
+  # JoomlaPower $joomla
+  + __construct(Config $config, Placeholder $placeholder, ...)
   + engine(string $string, array $placeholders, ...) : string
   # setReverse(string $updateString, string $string, ...) : string
   # reverseSuperPowers(string $updateString, string $string, ...) : string
-  # getReversePower(array $powers, array $useStatements) : ?array
+  # reverseJoomlaPowers(string $updateString, string $string, ...) : string
+  # getReversePower(array $powers, array $useStatements, ...) : ?array
   # reverseLanguage(string $updateString, string $string, ...) : string
   # reverseCustomCode(string $updateString, string $string) : string
 }
@@ -31,14 +33,15 @@ note right of Reverse::__construct
   since: 3.2.0
   
   arguments:
-    ?Config $config = null
-    ?Placeholder $placeholder = null
-    ?Language $language = null
-    ?Extractor $extractor = null
-    ?Power $power = null
+    Config $config
+    Placeholder $placeholder
+    Language $language
+    Extractor $extractor
+    Power $power
+    JoomlaPower $joomla
 end note
 
-note right of Reverse::engine
+note left of Reverse::engine
   Reverse Engineer the dynamic placeholders (TODO hmmmm this is not ideal)
 
   since: 3.2.0
@@ -67,7 +70,7 @@ note right of Reverse::setReverse
     ?array $useStatements
 end note
 
-note right of Reverse::reverseSuperPowers
+note left of Reverse::reverseSuperPowers
   Set the super powers keys for the reveres process
 
   since: 3.2.0
@@ -79,11 +82,28 @@ note right of Reverse::reverseSuperPowers
     ?array $useStatements
 end note
 
-note right of Reverse::getReversePower
+note right of Reverse::reverseJoomlaPowers
+  Set the joomla powers keys for the reveres process
+
+  since: 3.2.0
+  return: string
+  
+  arguments:
+    string $updateString
+    string $string
+    ?array $useStatements
+end note
+
+note left of Reverse::getReversePower
   Set the super powers keys for the reveres process
 
   since: 3.2.0
   return: ?array
+  
+  arguments:
+    array $powers
+    array $useStatements
+    string $target
 end note
 
 note right of Reverse::reverseLanguage
@@ -98,7 +118,7 @@ note right of Reverse::reverseLanguage
     string $target
 end note
 
-note right of Reverse::reverseCustomCode
+note left of Reverse::reverseCustomCode
   Set the custom code placeholder for the reveres process
 
   since: 3.2.0
diff --git a/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.php b/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.php
index 6a07554..bee45b6 100644
--- a/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.php
+++ b/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.php
@@ -21,6 +21,7 @@ use VDM\Joomla\Componentbuilder\Compiler\Placeholder;
 use VDM\Joomla\Componentbuilder\Compiler\Language;
 use VDM\Joomla\Componentbuilder\Compiler\Language\Extractor;
 use VDM\Joomla\Componentbuilder\Compiler\Power\Extractor as Power;
+use VDM\Joomla\Componentbuilder\Compiler\JoomlaPower\Extractor as JoomlaPower;
 
 
 /**
@@ -70,27 +71,36 @@ class Reverse
 	 **/
 	protected Power $power;
 
+	/**
+	 * Joomla Power Extractor
+	 *
+	 * @var    Power
+	 * @since 3.2.1
+	 **/
+	protected JoomlaPower $joomla;
+
 	/**
 	 * Constructor.
 	 *
-	 * @param Config|null          $config          The compiler config object.
-	 * @param Placeholder|null     $placeholder     The compiler placeholder object.
-	 * @param Language|null        $language        The compiler language object.
-	 * @param Extractor|null       $extractor       The compiler language extractor object.
-	 * @param Power|null           $power           The compiler power extractor object.
+	 * @param Config       $config       The compiler config object.
+	 * @param Placeholder  $placeholder  The compiler placeholder object.
+	 * @param Language     $language     The compiler language object.
+	 * @param Extractor    $extractor    The compiler language extractor object.
+	 * @param Power        $power        The compiler power extractor object.
 	 *
 	 * @since 3.2.0
 	 */
 	public function __construct(
-		?Config $config = null, ?Placeholder $placeholder = null,
-		?Language $language = null, ?Extractor $extractor = null,
-		?Power $power = null)
+		Config $config, Placeholder $placeholder,
+		Language $language, Extractor $extractor,
+		Power $power, JoomlaPower $joomla)
 	{
-		$this->config = $config ?: Compiler::_('Config');
-		$this->placeholder = $placeholder ?: Compiler::_('Placeholder');
-		$this->language = $language ?: Compiler::_('Language');
-		$this->extractor = $extractor ?: Compiler::_('Language.Extractor');
-		$this->power = $power ?: Compiler::_('Power.Extractor');
+		$this->config = $config;
+		$this->placeholder = $placeholder;
+		$this->language = $language;
+		$this->extractor = $extractor;
+		$this->power = $power;
+		$this->joomla = $joomla;
 	}
 
 	/**
@@ -138,8 +148,9 @@ class Reverse
 	protected function setReverse(string $updateString, string $string,
 		string $target, ?array $useStatements): string
 	{
-		// we have to reverse engineer to super powers
+		// we have to reverse engineer of powers
 		$updateString = $this->reverseSuperPowers($updateString, $string, $useStatements);
+		$updateString = $this->reverseJoomlaPowers($updateString, $string, $useStatements);
 
 		// reverse engineer the language strings
 		$updateString = $this->reverseLanguage($updateString, $string, $target);
@@ -165,7 +176,30 @@ class Reverse
 	{
 		// only if we have use statements can we reverse engineer this
 		if ($useStatements !== null && ($powers = $this->power->reverse($string)) !== null &&
-			($reverse = $this->getReversePower($powers, $useStatements)) !== null)
+			($reverse = $this->getReversePower($powers, $useStatements, 'Super')) !== null)
+		{
+			return $this->placeholder->update($updateString, $reverse);
+		}
+
+		return $updateString;
+	}
+
+	/**
+	 * Set the joomla powers keys for the reveres process
+	 *
+	 * @param   string      $updateString   The string to update
+	 * @param   string      $string         The string to use for super power update
+	 * @param   array|null  $useStatements  The file use statements (needed for super powers)
+	 *
+	 * @return  string
+	 * @since 3.2.0
+	 */
+	protected function reverseJoomlaPowers(string $updateString, string $string,
+		?array $useStatements): string
+	{
+		// only if we have use statements can we reverse engineer this
+		if ($useStatements !== null && ($powers = $this->joomla->reverse($string)) !== null &&
+			($reverse = $this->getReversePower($powers, $useStatements, 'Joomla')) !== null)
 		{
 			return $this->placeholder->update($updateString, $reverse);
 		}
@@ -178,11 +212,12 @@ class Reverse
 	 *
 	 * @param   array   $powers         The powers found in the database text
 	 * @param   array   $useStatements  The file use statements
+	 * @param   string  $target         The power target type
 	 *
 	 * @return  array|null
 	 * @since 3.2.0
 	 */
-	protected function getReversePower(array $powers, array $useStatements): ?array
+	protected function getReversePower(array $powers, array $useStatements, string $target): ?array
 	{
 		$matching_statements = [];
 		foreach ($useStatements as $use_statement)
@@ -211,7 +246,7 @@ class Reverse
 			{
 				$guid = array_search($namespace, $powers);
 				$matching_statements[$class_name] =
-					'Super_'.'_'.'_' . str_replace('-', '_', $guid) . '_'.'_'.'_Power';
+					$target . '_'.'_'.'_' . str_replace('-', '_', $guid) . '_'.'_'.'_Power';
 			}
 		}
 
diff --git a/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.power b/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.power
index 24dc1ae..4fcf7b5 100644
--- a/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.power
+++ b/src/ca111518-e47c-4049-b1b2-cb010f23866f/code.power
@@ -38,27 +38,36 @@
 	 **/
 	protected Power $power;
 
+	/**
+	 * Joomla Power Extractor
+	 *
+	 * @var    Power
+	 * @since 3.2.1
+	 **/
+	protected JoomlaPower $joomla;
+
 	/**
 	 * Constructor.
 	 *
-	 * @param Config|null          $config          The compiler config object.
-	 * @param Placeholder|null     $placeholder     The compiler placeholder object.
-	 * @param Language|null        $language        The compiler language object.
-	 * @param Extractor|null       $extractor       The compiler language extractor object.
-	 * @param Power|null           $power           The compiler power extractor object.
+	 * @param Config       $config       The compiler config object.
+	 * @param Placeholder  $placeholder  The compiler placeholder object.
+	 * @param Language     $language     The compiler language object.
+	 * @param Extractor    $extractor    The compiler language extractor object.
+	 * @param Power        $power        The compiler power extractor object.
 	 *
 	 * @since 3.2.0
 	 */
 	public function __construct(
-		?Config $config = null, ?Placeholder $placeholder = null,
-		?Language $language = null, ?Extractor $extractor = null,
-		?Power $power = null)
+		Config $config, Placeholder $placeholder,
+		Language $language, Extractor $extractor,
+		Power $power, JoomlaPower $joomla)
 	{
-		$this->config = $config ?: Compiler::_('Config');
-		$this->placeholder = $placeholder ?: Compiler::_('Placeholder');
-		$this->language = $language ?: Compiler::_('Language');
-		$this->extractor = $extractor ?: Compiler::_('Language.Extractor');
-		$this->power = $power ?: Compiler::_('Power.Extractor');
+		$this->config = $config;
+		$this->placeholder = $placeholder;
+		$this->language = $language;
+		$this->extractor = $extractor;
+		$this->power = $power;
+		$this->joomla = $joomla;
 	}
 
 	/**
@@ -106,8 +115,9 @@
 	protected function setReverse(string $updateString, string $string,
 		string $target, ?array $useStatements): string
 	{
-		// we have to reverse engineer to super powers
+		// we have to reverse engineer of powers
 		$updateString = $this->reverseSuperPowers($updateString, $string, $useStatements);
+		$updateString = $this->reverseJoomlaPowers($updateString, $string, $useStatements);
 
 		// reverse engineer the language strings
 		$updateString = $this->reverseLanguage($updateString, $string, $target);
@@ -133,7 +143,30 @@
 	{
 		// only if we have use statements can we reverse engineer this
 		if ($useStatements !== null && ($powers = $this->power->reverse($string)) !== null &&
-			($reverse = $this->getReversePower($powers, $useStatements)) !== null)
+			($reverse = $this->getReversePower($powers, $useStatements, 'Super')) !== null)
+		{
+			return $this->placeholder->update($updateString, $reverse);
+		}
+
+		return $updateString;
+	}
+
+	/**
+	 * Set the joomla powers keys for the reveres process
+	 *
+	 * @param   string      $updateString   The string to update
+	 * @param   string      $string         The string to use for super power update
+	 * @param   array|null  $useStatements  The file use statements (needed for super powers)
+	 *
+	 * @return  string
+	 * @since 3.2.0
+	 */
+	protected function reverseJoomlaPowers(string $updateString, string $string,
+		?array $useStatements): string
+	{
+		// only if we have use statements can we reverse engineer this
+		if ($useStatements !== null && ($powers = $this->joomla->reverse($string)) !== null &&
+			($reverse = $this->getReversePower($powers, $useStatements, 'Joomla')) !== null)
 		{
 			return $this->placeholder->update($updateString, $reverse);
 		}
@@ -146,11 +179,12 @@
 	 *
 	 * @param   array   $powers         The powers found in the database text
 	 * @param   array   $useStatements  The file use statements
+	 * @param   string  $target         The power target type
 	 *
 	 * @return  array|null
 	 * @since 3.2.0
 	 */
-	protected function getReversePower(array $powers, array $useStatements): ?array
+	protected function getReversePower(array $powers, array $useStatements, string $target): ?array
 	{
 		$matching_statements = [];
 		foreach ($useStatements as $use_statement)
@@ -179,7 +213,7 @@
 			{
 				$guid = array_search($namespace, $powers);
 				$matching_statements[$class_name] =
-					'Super_'.'_'.'_' . str_replace('-', '_', $guid) . '_'.'_'.'_Power';
+					$target . '_'.'_'.'_' . str_replace('-', '_', $guid) . '_'.'_'.'_Power';
 			}
 		}
 
diff --git a/src/ca111518-e47c-4049-b1b2-cb010f23866f/settings.json b/src/ca111518-e47c-4049-b1b2-cb010f23866f/settings.json
index 3693d10..86ee7d9 100644
--- a/src/ca111518-e47c-4049-b1b2-cb010f23866f/settings.json
+++ b/src/ca111518-e47c-4049-b1b2-cb010f23866f/settings.json
@@ -45,6 +45,10 @@
         "use_selection8": {
             "use": "eeb03266-22fd-45bb-953a-961bb6be3a54",
             "as": "Power"
+        },
+        "use_selection9": {
+            "use": "82505f3f-297f-4d75-a581-929ab3e93689",
+            "as": "JoomlaPower"
         }
     },
     "namespace": "VDM\\Joomla\\Componentbuilder.Compiler.Placeholder.Reverse",