```csharp title="C#"
using Kreuzberg;

var processor = new WordCountProcessor();
PostProcessorRegistry.Register(processor);

public class WordCountProcessor : IPostProcessor
{
    public string Name => "word-count";
    public string Version => "1.0.0";

    public void Initialize()
    {
        Console.WriteLine("Word count processor initialized");
    }

    public void Shutdown()
    {
        Console.WriteLine("Word count processor shut down");
    }

    public void Process(ExtractionResult result, ExtractionConfig config)
    {
        var wordCount = CountWords(result.Content);

        if (result.Metadata == null)
        {
            result.Metadata = new Metadata();
        }

        Console.WriteLine($"Document contains {wordCount} words");
    }

    public ProcessingStage ProcessingStage()
    {
        return ProcessingStage.Early;
    }

    public bool ShouldProcess(ExtractionResult result, ExtractionConfig config)
    {
        return !string.IsNullOrEmpty(result.Content);
    }

    public ulong EstimatedDurationMs(ExtractionResult result)
    {
        return 5;
    }

    public int Priority()
    {
        return 50;
    }

    private int CountWords(string content)
    {
        if (string.IsNullOrWhiteSpace(content))
            return 0;

        return content.Split(new[] { ' ', '\t', '\n', '\r' }, System.StringSplitOptions.RemoveEmptyEntries).Length;
    }
}
```
