# Developer Tutorial: Creating Custom Modules

Welcome, contributor! This guide will show you how to extend the "太公心易" system by creating your own custom `MythologyEngine` and `CycleModel`.

The system is built on the principle of decoupling, using Abstract Base Classes (ABCs) to separate the core logic of the `MarketFSM` from the specific cultural or analytical models it uses. By creating new classes that inherit from these ABCs, you can fundamentally change the system's narrative and analytical framework without touching the core FSM logic.

## Part 1: Creating a Custom Mythology Engine

A `MythologyEngine` is responsible for providing the narrative flavor to the system. It maps technical components to mythological figures and processes. Let's create a `GreekMythologyEngine` as an example.

### Step 1: Create a New Python File

Create a new file, for example, `greek_mythology.py`.

### Step 2: Import the `MythologyEngine` ABC

In your new file, import the abstract base class from `mythology.py`:

```python
# greek_mythology.py
from mythology import MythologyEngine
```

### Step 3: Implement the `MythologyEngine` Interface

Create a new class that inherits from `MythologyEngine` and implements all its abstract methods: `get_actor_name`, `get_process_metaphor`, and `get_system_narrative`.

```python
class GreekMythologyEngine(MythologyEngine):
    """
    An implementation of the MythologyEngine based on Greek mythology.
    """
    def __init__(self):
        self._actor_map = {
            'collector': 'The Muses',
            'refiner': 'Hephaestus',
            'verifier': 'Apollo',
            'synthesizer': 'Zeus',
        }
        self._process_map = {
            'multi_agent_debate': 'Symposium',
            'refinement_process': 'Forging in Aetna',
            'external_verification': 'Consulting the Oracle of Delphi',
            'final_decision': 'Judgment from Olympus',
        }
        self._narrative = "This system views the market as a pantheon of competing gods and heroes, striving for dominance on Mount Olympus."

    def get_actor_name(self, component: str) -> str:
        return self._actor_map.get(component, "An Unknown Titan")

    def get_process_metaphor(self, process: str) -> str:
        return self._process_map.get(process, "A Herculean Task")

    def get_system_narrative(self) -> str:
        return self._narrative
```

### Step 4: Integrate with the FSM

Now, you can instantiate your new engine and inject it into the `MarketFSM`. The FSM will work seamlessly with your new narrative layer.

```python
# In your main application file
from market_fsm import MarketFSM
from greek_mythology import GreekMythologyEngine
from cycle_models import TwelveStagesOfLifeCycleModel # We can reuse the old cycle model

# Instantiate your custom engine
greek_engine = GreekMythologyEngine()
cycle_model = TwelveStagesOfLifeCycleModel()

# Inject it into the FSM
fsm = MarketFSM(
    mythology_engine=greek_engine,
    cycle_model=cycle_model
)

# Run the analysis
fsm.run_analysis({"mock_score": 8}) 
# The output will now be framed in the language of Greek mythology!
```

## Part 2: Creating a Custom Cycle Model

A `CycleModel` is responsible for analyzing market data and determining the current stage of a given cycle. Let's create a simple `MarketSentimentCycleModel` based on four stages: Greed, Fear, Hope, and Despair.

### Step 1: Create a New Python File

Create a file named `sentiment_cycle.py`.

### Step 2: Import the `CycleModel` ABC

```python
# sentiment_cycle.py
from cycle_models import CycleModel
from typing import Dict, Any, List
```

### Step 3: Implement the `CycleModel` Interface

Create a new class that inherits from `CycleModel` and implements `get_current_stage`, `get_stage_characteristics`, and `get_all_stages`.

```python
class MarketSentimentCycleModel(CycleModel):
    """
    A cycle model based on the four stages of market sentiment.
    """
    def __init__(self):
        self._stages = ["Hope", "Greed", "Fear", "Despair"]
        self._characteristics = {
            "Hope": {"description": "The market is cautiously optimistic.", "strategy": "Accumulate"},
            "Greed": {"description": "Euphoria and high expectations dominate.", "strategy": "Take profits"},
            "Fear": {"description": "Panic and uncertainty are widespread.", "strategy": "Reduce risk"},
            "Despair": {"description": "Capitulation, the market has given up hope.", "strategy": "Look for bargains"},
        }

    def get_current_stage(self, data: Dict[str, Any]) -> str:
        # A real implementation would analyze news sentiment, VIX, etc.
        # Here, we'll use a mock sentiment score from 0 to 1.
        sentiment_score = data.get("sentiment", 0.5)
        if sentiment_score > 0.75:
            return "Greed"
        elif sentiment_score > 0.5:
            return "Hope"
        elif sentiment_score > 0.25:
            return "Fear"
        else:
            return "Despair"

    def get_stage_characteristics(self, stage: str) -> Dict[str, Any]:
        return self._characteristics.get(stage, {})

    def get_all_stages(self) -> List[str]:
        return self._stages
```

### Step 4: Integrate with the FSM

You can now use your new cycle model in the FSM, even combining it with a different mythology engine.

```python
# In your main application file
from market_fsm import MarketFSM
from mythology import DaoistMythologyEngine
from sentiment_cycle import MarketSentimentCycleModel

# Instantiate your custom cycle model
sentiment_model = MarketSentimentCycleModel()
daoist_engine = DaoistMythologyEngine()

# Inject it into the FSM
fsm = MarketFSM(
    mythology_engine=daoist_engine,
    cycle_model=sentiment_model
)

# Run the analysis with data your new model understands
fsm.run_analysis({"sentiment": 0.2}) 
# The FSM will now report the market is in a state of "Despair".
```

Congratulations! You have successfully extended the "太公心易" system.
